package com.cloudlinkin.util.error;

import com.cloudlinkin.util._HttpKit;
import com.cloudlinkin.util._HttpResponse;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang3.StringUtils;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;


/**
 * 发送错误日志工具类 本机器的IP地址 提前在启动脚本里设置成JVM参数 -DipAddr=127.xxx.xxx.xxx供系统使用
 * 
 */
public class RecordingExceptionUtil {

	private static final String PARAM_Key_userid = "userid";
	private static final String PARAM_Key_sign = "sign";
	private static final String PARAM_Key_submit_time = "submit_time";
	private static final String PARAM_Key_content = "content";
	private static final String ENCODING = "utf-8";
	private static String RECORDING_EXCEPTION_URL = null; // 上报请求地址
	private static String SIGN_KEY = null; // 验证秘钥
	private static String PARAM_userid_value = null; // 企业ID
	private static String IP_ADDR = System.getProperty("ipAddr"); // 本机器的IP地址
																	// 提前在启动脚本里设置成JVM参数
																	// -DipAddr=127.xxx.xxx.xxx
	private static int WORD_COUNT_LIMIT = 55; // 报告内容长度 写在配置文件中了

	private static final SimpleDateFormat DateFormat = new SimpleDateFormat("yyyyMMddHHmmss"); // 时间工具

	private RecordingExceptionUtil() {
	}

	/**
	 * 读取properties配置文件 加载必要参数
	 */
	static {
		try {
			Properties p = new Properties();
			p.load(RecordingExceptionUtil.class.getClassLoader().getResourceAsStream("recordingException.properties"));
			RECORDING_EXCEPTION_URL = p.getProperty("RECORDING_EXCEPTION_URL");
			SIGN_KEY = p.getProperty("SIGN_KEY");
			PARAM_userid_value = p.getProperty("USER_ID");
			WORD_COUNT_LIMIT = Integer.valueOf(p.getProperty("WORD_COUNT_LIMIT"));
			p = null;
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	// // 测试
	// public static void main(String[] args) throws IOException {
	// System.err.println(RECORDING_EXCEPTION_URL);
	// RECORDING_EXCEPTION_URL =
	// "http://192.168.10.95:8080/CloudlinkinWarningApi/warning/submit"; // 润华地址
	// recording("=====测试错误信息接口上报测试错误信息接口上报测试错误信息接口上报测试错误信息接口上报测试错误信息接口上报测试错误信");
	// }

	/**
	 * 模拟请求 返回结果
	 * 
	 * @param map
	 *            参数列表
	 * @return
	 * @throws Exception
	 */
	public static String send(Map<String, String> map) throws Exception {

		_HttpResponse post = _HttpKit.post(RECORDING_EXCEPTION_URL, map, "utf-8");

		return post.getCode() == 200 ? post.getStringMessage() : null;

	}

	/**
	 * 向异常记录接口请求发送数据
	 * 
	 * @param content
	 *            报警内容 长度在控制在WORD_COUNT_LIMIT 包括IP地址
	 * @throws Exception 
	 */
	public static String recording(String content) throws Exception {

		Map<String, String> map = new HashMap<>();

		map.put(PARAM_Key_userid, PARAM_userid_value);
		String submitTime = DateFormat.format(System.currentTimeMillis());
		map.put(PARAM_Key_sign, DigestUtils.md5Hex(submitTime + SIGN_KEY));
		map.put(PARAM_Key_submit_time, submitTime);

		if (StringUtils.isNotBlank(content) && content.length() > WORD_COUNT_LIMIT) {
			content = content.substring(0, WORD_COUNT_LIMIT);
		}
		map.put(PARAM_Key_content, IP_ADDR + content);

		// 发送请求
		String status = send(map);

		return status;
	}

}